<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数组扁平化</title>
</head>

<body>
    <script>
        /*
        对于 [1, [1,2], [1,2,3]] 这样多层嵌套的数组，
        我们如何将其扁平化为 [1, 1, 2, 1, 2, 3] 这样的一维数组呢：
        */
        // 1）ES6 的 flat()
        let arr = [
            1, [
                1,
                2
            ],
            [
                1,
                2,
                3
            ]
        ]
        console.log(arr.flat(Infinity))

        // 2）序列化后正则
        const str = `[${JSON.stringify(arr).replace(/(\[|\])/g, '')}]`
        JSON.parse(str)
        console.log(str)

        // 3）递归
        function flat(arr) {
            let result = []
            for (const item of arr) {
                item instanceof Array ? result = result.concat(flat(item)) : result.push(item)
            }
            return result
        }
        console.log(flat(arr))

        // 4）reduce()递归
        function flat1(arr) {
            return arr.reduce((prev, cur) => {
                return prev.concat(cur instanceof Array ? flat(cur) : cur)
            }, [])
        }
        console.log(flat1(arr))

        // 5）迭代+展开运算符
        while (arr.some(Array.isArray)) {
            arr = [].concat(...arr);
        }
        console.log(arr)
    </script>
</body>

</html>